#ifndef THREAD_HANDLER
#define THREAD_HANDLER

#include <thread>
#include <mutex>
#include <list>
#include "thread_handler.h"
extern "C"
{
#include <libavcodec/avcodec.h>
}

namespace lcf
{
    class ThreadHandler
    {
    public:
        ThreadHandler() : isPause_(false),
                          isExit_(false),
                          index_(0) {}
        ~ThreadHandler() {}
        // 启动线程
        virtual void Start();
        // 停止线程
        virtual void Stop();

        // 执行任务 需要重载
        virtual void HandleTask(AVPacket *pkt) {}

        // 暂停或者播放
        virtual void SetIsPause(bool isPause) { isPause_ = isPause; };
        // 设置责任链下一个节点
        void SetSuccessor(std::shared_ptr<ThreadHandler> successor, bool isOpen)
        {
            std::unique_lock<std::mutex> lock(m_);
            successorList_.emplace_back(successor, isOpen);
        }

        bool IsPause() { return isPause_; }
        bool IsExit() { return isExit_; }

        // 传递到下一个责任链函数
        virtual void Next(AVPacket *pkt)
        {
            std::unique_lock<std::mutex> lock(m_);
            for (auto &successorPair : successorList_)
            {
                if (successorPair.second)
                {
                    successorPair.first->HandleTask(pkt);
                }
            }
        }

    protected:
        virtual void Main() = 0; // 线程入口函数
        bool isPause_;
        bool isExit_; // 标志线程退出
        int index_;   // 线程索引号

    private:
        std::thread th_;
        std::mutex m_;
        std::list<std::pair<std::shared_ptr<ThreadHandler>, bool>> successorList_;
    };

}

#endif